/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package controladores;

import controladores.exceptions.IllegalOrphanException;
import controladores.exceptions.NonexistentEntityException;
import controladores.exceptions.PreexistingEntityException;
import entidades.Estudios;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import entidades.Unidadorganizacional;
import java.util.ArrayList;
import java.util.List;
import entidades.Estudiopersona;

/**
 *
 * @author Andres
 */
public class EstudiosJpaController {

    public EstudiosJpaController() {
        emf = Persistence.createEntityManagerFactory("proyectoCongresoPU");
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(Estudios estudios) throws PreexistingEntityException, Exception {
        if (estudios.getUnidadorganizacionalList() == null) {
            estudios.setUnidadorganizacionalList(new ArrayList<Unidadorganizacional>());
        }
        if (estudios.getEstudiopersonaList() == null) {
            estudios.setEstudiopersonaList(new ArrayList<Estudiopersona>());
        }
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            List<Unidadorganizacional> attachedUnidadorganizacionalList = new ArrayList<Unidadorganizacional>();
            for (Unidadorganizacional unidadorganizacionalListUnidadorganizacionalToAttach : estudios.getUnidadorganizacionalList()) {
                unidadorganizacionalListUnidadorganizacionalToAttach = em.getReference(unidadorganizacionalListUnidadorganizacionalToAttach.getClass(), unidadorganizacionalListUnidadorganizacionalToAttach.getCodigounidad());
                attachedUnidadorganizacionalList.add(unidadorganizacionalListUnidadorganizacionalToAttach);
            }
            estudios.setUnidadorganizacionalList(attachedUnidadorganizacionalList);
            List<Estudiopersona> attachedEstudiopersonaList = new ArrayList<Estudiopersona>();
            for (Estudiopersona estudiopersonaListEstudiopersonaToAttach : estudios.getEstudiopersonaList()) {
                estudiopersonaListEstudiopersonaToAttach = em.getReference(estudiopersonaListEstudiopersonaToAttach.getClass(), estudiopersonaListEstudiopersonaToAttach.getEstudiopersonaPK());
                attachedEstudiopersonaList.add(estudiopersonaListEstudiopersonaToAttach);
            }
            estudios.setEstudiopersonaList(attachedEstudiopersonaList);
            em.persist(estudios);
            for (Unidadorganizacional unidadorganizacionalListUnidadorganizacional : estudios.getUnidadorganizacionalList()) {
                unidadorganizacionalListUnidadorganizacional.getEstudiosList().add(estudios);
                unidadorganizacionalListUnidadorganizacional = em.merge(unidadorganizacionalListUnidadorganizacional);
            }
            for (Estudiopersona estudiopersonaListEstudiopersona : estudios.getEstudiopersonaList()) {
                Estudios oldEstudiosOfEstudiopersonaListEstudiopersona = estudiopersonaListEstudiopersona.getEstudios();
                estudiopersonaListEstudiopersona.setEstudios(estudios);
                estudiopersonaListEstudiopersona = em.merge(estudiopersonaListEstudiopersona);
                if (oldEstudiosOfEstudiopersonaListEstudiopersona != null) {
                    oldEstudiosOfEstudiopersonaListEstudiopersona.getEstudiopersonaList().remove(estudiopersonaListEstudiopersona);
                    oldEstudiosOfEstudiopersonaListEstudiopersona = em.merge(oldEstudiosOfEstudiopersonaListEstudiopersona);
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            if (findEstudios(estudios.getCodigo()) != null) {
                throw new PreexistingEntityException("Estudios " + estudios + " already exists.", ex);
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(Estudios estudios) throws IllegalOrphanException, NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Estudios persistentEstudios = em.find(Estudios.class, estudios.getCodigo());
            List<Unidadorganizacional> unidadorganizacionalListOld = persistentEstudios.getUnidadorganizacionalList();
            List<Unidadorganizacional> unidadorganizacionalListNew = estudios.getUnidadorganizacionalList();
            List<Estudiopersona> estudiopersonaListOld = persistentEstudios.getEstudiopersonaList();
            List<Estudiopersona> estudiopersonaListNew = estudios.getEstudiopersonaList();
            List<String> illegalOrphanMessages = null;
            for (Estudiopersona estudiopersonaListOldEstudiopersona : estudiopersonaListOld) {
                if (!estudiopersonaListNew.contains(estudiopersonaListOldEstudiopersona)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Estudiopersona " + estudiopersonaListOldEstudiopersona + " since its estudios field is not nullable.");
                }
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            List<Unidadorganizacional> attachedUnidadorganizacionalListNew = new ArrayList<Unidadorganizacional>();
            for (Unidadorganizacional unidadorganizacionalListNewUnidadorganizacionalToAttach : unidadorganizacionalListNew) {
                unidadorganizacionalListNewUnidadorganizacionalToAttach = em.getReference(unidadorganizacionalListNewUnidadorganizacionalToAttach.getClass(), unidadorganizacionalListNewUnidadorganizacionalToAttach.getCodigounidad());
                attachedUnidadorganizacionalListNew.add(unidadorganizacionalListNewUnidadorganizacionalToAttach);
            }
            unidadorganizacionalListNew = attachedUnidadorganizacionalListNew;
            estudios.setUnidadorganizacionalList(unidadorganizacionalListNew);
            List<Estudiopersona> attachedEstudiopersonaListNew = new ArrayList<Estudiopersona>();
            for (Estudiopersona estudiopersonaListNewEstudiopersonaToAttach : estudiopersonaListNew) {
                estudiopersonaListNewEstudiopersonaToAttach = em.getReference(estudiopersonaListNewEstudiopersonaToAttach.getClass(), estudiopersonaListNewEstudiopersonaToAttach.getEstudiopersonaPK());
                attachedEstudiopersonaListNew.add(estudiopersonaListNewEstudiopersonaToAttach);
            }
            estudiopersonaListNew = attachedEstudiopersonaListNew;
            estudios.setEstudiopersonaList(estudiopersonaListNew);
            estudios = em.merge(estudios);
            for (Unidadorganizacional unidadorganizacionalListOldUnidadorganizacional : unidadorganizacionalListOld) {
                if (!unidadorganizacionalListNew.contains(unidadorganizacionalListOldUnidadorganizacional)) {
                    unidadorganizacionalListOldUnidadorganizacional.getEstudiosList().remove(estudios);
                    unidadorganizacionalListOldUnidadorganizacional = em.merge(unidadorganizacionalListOldUnidadorganizacional);
                }
            }
            for (Unidadorganizacional unidadorganizacionalListNewUnidadorganizacional : unidadorganizacionalListNew) {
                if (!unidadorganizacionalListOld.contains(unidadorganizacionalListNewUnidadorganizacional)) {
                    unidadorganizacionalListNewUnidadorganizacional.getEstudiosList().add(estudios);
                    unidadorganizacionalListNewUnidadorganizacional = em.merge(unidadorganizacionalListNewUnidadorganizacional);
                }
            }
            for (Estudiopersona estudiopersonaListNewEstudiopersona : estudiopersonaListNew) {
                if (!estudiopersonaListOld.contains(estudiopersonaListNewEstudiopersona)) {
                    Estudios oldEstudiosOfEstudiopersonaListNewEstudiopersona = estudiopersonaListNewEstudiopersona.getEstudios();
                    estudiopersonaListNewEstudiopersona.setEstudios(estudios);
                    estudiopersonaListNewEstudiopersona = em.merge(estudiopersonaListNewEstudiopersona);
                    if (oldEstudiosOfEstudiopersonaListNewEstudiopersona != null && !oldEstudiosOfEstudiopersonaListNewEstudiopersona.equals(estudios)) {
                        oldEstudiosOfEstudiopersonaListNewEstudiopersona.getEstudiopersonaList().remove(estudiopersonaListNewEstudiopersona);
                        oldEstudiosOfEstudiopersonaListNewEstudiopersona = em.merge(oldEstudiosOfEstudiopersonaListNewEstudiopersona);
                    }
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Integer id = estudios.getCodigo();
                if (findEstudios(id) == null) {
                    throw new NonexistentEntityException("The estudios with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(Integer id) throws IllegalOrphanException, NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Estudios estudios;
            try {
                estudios = em.getReference(Estudios.class, id);
                estudios.getCodigo();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The estudios with id " + id + " no longer exists.", enfe);
            }
            List<String> illegalOrphanMessages = null;
            List<Estudiopersona> estudiopersonaListOrphanCheck = estudios.getEstudiopersonaList();
            for (Estudiopersona estudiopersonaListOrphanCheckEstudiopersona : estudiopersonaListOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Estudios (" + estudios + ") cannot be destroyed since the Estudiopersona " + estudiopersonaListOrphanCheckEstudiopersona + " in its estudiopersonaList field has a non-nullable estudios field.");
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            List<Unidadorganizacional> unidadorganizacionalList = estudios.getUnidadorganizacionalList();
            for (Unidadorganizacional unidadorganizacionalListUnidadorganizacional : unidadorganizacionalList) {
                unidadorganizacionalListUnidadorganizacional.getEstudiosList().remove(estudios);
                unidadorganizacionalListUnidadorganizacional = em.merge(unidadorganizacionalListUnidadorganizacional);
            }
            em.remove(estudios);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<Estudios> findEstudiosEntities() {
        return findEstudiosEntities(true, -1, -1);
    }

    public List<Estudios> findEstudiosEntities(int maxResults, int firstResult) {
        return findEstudiosEntities(false, maxResults, firstResult);
    }

    private List<Estudios> findEstudiosEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(Estudios.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public Estudios findEstudios(Integer id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Estudios.class, id);
        } finally {
            em.close();
        }
    }

    public int getEstudiosCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<Estudios> rt = cq.from(Estudios.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }

}
